package com.guo.dms.common.tree.util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.guo.dms.common.tree.entity.Node;
import com.guo.dms.common.tree.entity.TreeNode;


public class TreeUtils {
	/**
	 * menulist的值加载到rootnode树节点中，
	 * @param menus  所有menu队列
	 * @param rootNode 当前结点
	 * @return
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */
	@SuppressWarnings( { "unchecked", "rawtypes" } )
	public static  TreeNode<?> getNodeTree(List<? extends Node> nodes,Node   rootNode) {
		TreeNode<? extends Node> rootTreeNode=new TreeNode<Node>(rootNode);
		Integer parentId = rootTreeNode.getNode().getId();
		List  childs=new ArrayList<>();
		for (Node node : nodes) {
			if(node.getParentId().equals(parentId)){
				//递归进行下级元素添加
				/* TreeNode rt = rootNode.getClass().newInstance();
				 rt.setNode(node);*/
				 childs.add(getNodeTree(nodes,node));
			}
		}
		rootTreeNode.setChilds(childs);
		return rootTreeNode;
	}
	
	/**
	 * 给出根节点id 和一组数据 返回treeNode对象
	 * @param nodes
	 * @param rootNodeId
	 * @return
	 */
	public static  TreeNode<?> getNodeTreeByHashMap(List<? extends Node> nodes,Integer rootNodeId) {
	    Map<Integer,TreeNode> continer=new HashMap<>();
	    //将集合元素放入map中
	    for (Node node : nodes) {
			continer.put(node.getId(), new TreeNode<>(node));
		}
	    
	    for (Node node : nodes) {
	    	//如果是一层节点
			if(node.getId()!=rootNodeId){
				TreeNode tree = continer.get(node.getParentId());
				tree.getChilds().add( continer.get(node.getId()));
			}
		}
		return continer.get(rootNodeId);
	}
	
	/**
	 * 将节点中 父节点为0的节点 或者父节点为null的 节点为根组成树结构
	 * @param nodes
	 * @param rootNodeId
	 * @return
	 */
	public static  List<TreeNode> getNodeTrees(List<? extends Node> allnodes) {
	    Map<Integer,TreeNode> continer=new HashMap<>();
	    List<TreeNode> treeNodes=new ArrayList<>();
	    //将集合元素放入map中
	    for (Node node : allnodes) {
			continer.put(node.getId(), new TreeNode<>(node));
		}
	    
	    for (Node node : allnodes) {
	    	//如果是一层节点
			if(node.getParentId()!=null && node.getParentId()!=0    ){
				continer.get(node.getParentId()).getChilds().add( continer.get(node.getId()));
			}else{
				treeNodes.add(continer.get(node.getId()));
			}
		}
		return treeNodes;
	}
	
	/**
	 * 输出节点
	 * @param node
	 * @param pre
	 */
	public static void printMenuNode(TreeNode<? extends Node> node,String pre){
		 System.err.println(pre+""+node.getNode().getName()+","+node.getNode().getId());
		 if(node.getChilds()!=null || node.getChilds().size()>0){
			 for (TreeNode<?> menuNode : node.getChilds()) {
				 printMenuNode(menuNode,pre+pre);
			}
		 }
	}
}
